package mao.thinkinjava.io;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.nio.channels.FileChannel;
import java.nio.charset.Charset;

public class BufferToText {
    public static void main(String[] args) throws IOException {
        //使用正确的方式解码。
        System.out.println("=====");
        FileChannel fc = new FileOutputStream("data.txt").getChannel();
        fc.write(ByteBuffer.wrap("some text".getBytes()));
        fc.close();

        fc = new FileInputStream("data.txt").getChannel();
        ByteBuffer buffer = ByteBuffer.allocate(24);
        fc.read(buffer);
        buffer.flip();
        String encoding = System.getProperty("file.encoding");
        System.out.println(encoding);
        CharBuffer decode = Charset.forName(encoding).decode(buffer);
        System.out.println(decode.toString());

        //使用正确的编码方式？？？------utf-16BE使用16字节来存储一个字符，使用大端字节序，高位存在低地址。
        System.out.println("=============");
         fc = new FileOutputStream("data.txt").getChannel();
        fc.write(ByteBuffer.wrap("some text".getBytes("utf-16BE")));
        fc.close();

        fc = new FileInputStream("data.txt").getChannel();
         buffer = ByteBuffer.allocate(24);
        fc.read(buffer);
        buffer.flip();
        System.out.println(buffer.asCharBuffer());

        //使用charbuffer去写
        System.out.println("============");
         fc = new FileOutputStream("data.txt").getChannel();
        ByteBuffer allocate = ByteBuffer.allocate(24);
        //这里使用的是Unicode
        allocate.asCharBuffer().put("some text");
        fc.write(allocate);
        fc.close();

        fc = new FileInputStream("data.txt").getChannel();
         buffer = ByteBuffer.allocate(24);
        fc.read(buffer);
        //连续两次调用flip会出问题，第一次调用position=0，limit=prePosition
        //第二次调用 position=0，limit=Preposition。
        buffer.flip();
        //asCharBuffer没有数据填充的也被打印出来了。
        System.out.println(buffer.asCharBuffer()+"====");

        //rewind不会修改limit而flip会修改limit。
        buffer.rewind();
        buffer.position();
    }
}
